package my.test.csdn.weixin_43767015.basic.ch12.transaction.declarative.annotation.eachcall.service.transform;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
public class EachCallTransform1 {
    /**
     * 当前类自己注入自己，实际上注入的是一个代理对象，然后我们就可以使用这个注入的代理对象去调用内层方法了
     * 这实际上是一种循环依赖，但是Spring可以帮我们解决这种字段反射注入的循环依赖
     */
    @Resource
    private EachCallTransform1 eachCallTransform1;
    
    /**
     * jdbc模版，用于操作数据库
     */
    @Resource
    private JdbcTemplate jdbcTemplate;
    
    public void m1() {
        System.out.println(eachCallTransform1.getClass());
        //使用注入的eachCall调用m2方法，即可解决问题
        eachCallTransform1.m2();
    }
    
    @Transactional
    public void m2() {
        String sql = "insert into tx_study (name,age) values (?,?)";
        jdbcTemplate.update(sql, "EachCall", 30);
        //抛出一个RuntimeException
        throw new RuntimeException();
    }
}
